package main

import "fmt"

// 声明pairs变量为map[byte]byte类型，存储右括号到左括号的映射关系
var pairs = map[string]string{
	")": "(", // byte类型键值对：右圆括号')'映射到左圆括号'('
	"]": "[", // byte类型键值对：右方括号']'映射到左方括号'['
	"}": "{", // byte类型键值对：右花括号'}'映射到左花括号'{'
}

func main() {
	fmt.Println(isValid("()[]{}"))
}

// isValid 检查括号字符串是否有效，参数s为string类型，返回bool类型
func isValid(s string) bool {
	// 声明变量n为int类型，存储字符串s的长度
	n := len(s)
	// 判断n是否为奇数，使用int类型的取模运算符%
	if n%2 == 1 {
		// 返回bool类型值false
		return false
	}

	// 声明stack变量为[]byte类型(字节切片)，用作栈结构存储左括号
	stack := []string{}
	// 声明循环变量i为int类型，遍历字符串中的每个字符
	for i := 0; i < n; i++ {
		// 获取当前字符并转换为字符串
		char := string(s[i])
		// 判断当前字符s[i](byte类型)是否为右括号(在map中存在对应的值)
		if pairs[char] != "" {
			// 检查栈是否为空或栈顶元素(最后一个元素)是否不匹配
			if len(stack) == 0 || stack[len(stack)-1] != pairs[char] {
				// 返回bool类型值false
				return false
			}
			// 弹出栈顶元素，使用切片操作[:len(stack)-1]移除最后一个元素
			stack = stack[:len(stack)-1]
		} else {
			// 将当前字符(左括号)追加到栈中，使用append函数操作[]byte切片
			stack = append(stack, char)
		}
	}
	// 检查栈是否为空，返回bool类型结果(len(stack)为int类型，与0比较得到bool值)
	return len(stack) == 0
}
